
#include "JsonLexParser.h"
#include "JsonParserObject.h"
#include <iostream>
// Json 语法

//     program_start = object Token_END_DOC | array Token_END_DOC

//     object = {} | { members }
//     members = pair | pair , members
//     pair = string : value
//     array = [] | [ elements ]
//     elements = value  | value , elements
//     value = string | number | object | array | true | false | null



// 函数
void f_program_start();
void match(Token t);
void f_object();
void f_members();
void f_pair();
void f_array();
void f_elements();
void f_value();


// void is_Token_Value
// {
//     if(currToken == Token_STRING || currToken == Token_INTNUMBER || currToken == )
// }
void match(Token t)
{
    if(t!=currToken)
    {
        exit(0);
    }
}

//     program_start = object Token_END_DOC | array Token_END_DOC
void f_program_start()
{
    getNextChar();
    getToken();
    if(currToken == Token_START_ARRAY)
    {
        f_array();
    }
    else if(currToken == Token_START_OBJ)
    {
        f_object();
    }
    else
    {
        exit(0);
    }
    //getToken();
    match(Token_END_DOC);
    std::cout<<"grammer parse finish"<<std::endl;

}

//     object = {} | { members }
void f_object()
{
    match(Token_START_OBJ);
    getToken();
    if (currToken != Token_END_OBJ)
    {
        f_members();
    }
    //getToken();
    match(Token_END_OBJ);
    getToken();
}

//  
//members = pair | pair , members
void f_members()
{
    f_pair();
    //getToken();
    if(currToken == Token_COMMA)
    {
        getToken();
        f_members(); 
    }      
}

//     pair = string : value
void f_pair()
{
    if(currToken == Token_STRING)
    {
        getToken();
        match(Token_COLON);
        getToken();
        f_value();
    }
    else
    {
        exit(0);
    } 
}

//     array = [] | [ elements ]
void f_array()
{
    match(Token_START_ARRAY);
    getToken();
    if (currToken != Token_END_ARRAY)
    {
        f_elements();
    }
    match(Token_END_ARRAY);
    getToken();
    
}

//     elements = value  | value , elements

void f_elements()
{
    f_value();
    //getToken();
    if(currToken == Token_COMMA)
    {
        getToken();
        f_elements();
    }
}
//     value = string | number | object | array | true | false | null
void f_value()
{
    switch (currToken)
    {
        case Token_STRING:
        {   getToken(); 
            break;
        }
        case Token_INTNUMBER:
        {   getToken(); 
            break;
        }
        case Token_FLOATNUMBER:
        {   getToken();  
            break;
        }
        case Token_BOOLEAN:
        {   getToken(); 
            break;
        }
        case Token_START_ARRAY:
        {   
            f_array();
            break;
        }
        case Token_START_OBJ:
        {
            f_object();
            break;
        }
    }
}